package com.czk.doc;

import com.alibaba.fastjson.JSON;
import com.czk.entity.User;
import com.czk.util.ClientUtil;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.xcontent.XContentType;

import java.io.IOException;

/**
 * 插入流程：
 * 1 客户端请求集群任意节点，称为协调节点
 * 2 协调节点将请求转换到指定的节点（hash算法等）
 * 3 主分片需要将数据保存
 * 4 主分片需要将数据发送到副本
 * 5 副本保存后进行反馈
 * 6 主分片进行反馈
 * 延时：主分片的延时和副本同步的延时
 * 文档刷新：
 * 内存中的数据刷写道磁盘中，为防止宕机的数据丢失，创建索引时同时写入translog,在文档刷新成功后清除translog中的数据。
 * 顺序：先写内存，再写日志。注意：没有进行文档刷写（os cahche）的时候是不能查询的。
 * OS Cache:
 * es先写入文件系统内存的缓冲区refresh(1s)此时能查询再进行flush（30min）文件刷写
 * 文档合并: 为了减少索引文档的个数，在进行文档刷新时汇金文档合并，合并时会删除打了删除标记的逻辑删除的文档
 *
 * @Author:ChenZhangKun
 * @Date: 2021/6/13 14:03
 */
public class InsertDoc {
    public static void main(String[] args) throws IOException {
        // 拿到客户端
        RestHighLevelClient highLevelClient = ClientUtil.getHighLevelClient();
        // 插入数据
        IndexRequest indexRequest = new IndexRequest();
        indexRequest.index("user_2").id("1001");
        // 创建对象
        User user = new User("陈彰坤", 26);
        // 转为json
        String jsonUser = JSON.toJSONString(user);
        // 天剑请求体
        indexRequest.source(jsonUser, XContentType.JSON);
        // 插入
        IndexResponse response = highLevelClient.index(indexRequest, RequestOptions.DEFAULT);
        // 拿到结果
        System.out.println(response.getResult());
        highLevelClient.close();
    }
}
